iOSアプリ「Pythonista3」でめそ子さんと記念写真を撮れるようにしてみた※追記あり
こんにちは。池田です。入社後初の出張では迷子にならず無事に札幌へ戻って来ました。
本日はiOS上にPythonの開発、実行環境を提供してくれるアプリPythonista3(AppStoreで1200円 本投稿公開時点の価格です)を使った画像加工についてご紹介します。
※友人より本投稿内に掲載しているコードに対してご指摘をいただいたので追記しております。
なお、Pythonista3の操作方法とPythonコードの詳細解説については割愛いたします。ご了承ください。
はじめに
Pythonista3とは
iOS上でPythonの開発、実行環境を提供するアプリケーションです。
標準でPython2.7とPython3.5の環境が用意されています。
Pythonista3環境の準備
Pythionista3はAppStoreからインストールした直後でも十分なのですが、次の2つを追加することでより強力なツールになります。
StaShの導入
Pythonista3上で動作するシェル環境です(wgetやpipなどが使えるようになります)。
公式フォーラムに記載されいてる下記コマンドをPython対話シェルにて実行します。
import requests as r; exec(r.get('http://bit.ly/get-stash').text)
Dropbox File Picker V2.py
Pythonista3からDropboxへアクセスし、任意のファイルをPythonista3がアクセスできる領域へダウンロードするスクリプトです。
(通常のカメラロールにあるファイルは、Pythonista3で直接扱えないのでDropboxを利用します。)
先の手順で導入したStaShシェル上で下記コマンドを実行します。
wget https://gist.github.com/encela95dus/67fd65aec0c25336ac8e70153ebcf7eb/raw/a8517a14e2f393be4091997d5bbe1f8466747dfe/Dropbox%2520File%2520Picker%2520V2.py
ダウンロードしたスクリプトはPythonista3のリスト上に表示されますが、ファイル名が「Dropbox%2520File%2520Picker%2520V2.py」となっていますので任意の名前に変更しておきます。
なお、Dropboxと連携するためのスクリプトは多数公開されていますが、APIバージョン1が廃止されていますのでご注意ください。
Dropboxアクセストークンの取得
ブラウザでDevelopers – Dropboxへログインします。
画面右上に「Create app」という青いボタンがありますので、クリックします。
「1.Choose an API」 の項目で「Dropbox API」を選択します。
「2.Choose the type of access you need」の項目で「Full Dropbox」を選択します。
「3.Name your app」の項目には任意の名前を入力します。ただし、名前には「Dropbox(大文字小文字問わず)」を含めることはできません。
画面右下の「 Create app」ボタンをクリックすると「Setting」画面に変遷します。「Generate access token」の項目にある「Generate」ボタンをクリックし、表示された文字列(アクセストークン)をコピーします。
ここでコピーしたアクセストークンはPythonista上にあるスクリプトにペーストします。PCのブラウザを利用してこの作業を行なった場合は、GmailやEvernoteなどを利用してiOS端末のクリップボードにコピーします。
Pythonista3を起動し、Dropbox File Picker V2.py(ファイル名は先の手順にて変更していますが)をタップしコードエディタで開きます。
コメント行が終わったところに
TOKEN = 'YOUR_TOKEN_HERE'
とありますので「YOUR_TOKEN_HERE」をDropboxAPIのアクセストークンに書き換えます。
そのままスクリプトを実行しDropbox上に保存しているファイルのリストが表示されれば成功です。Pythonistaで扱いたいファイルをタップするとダウンロードされます。
この方法を用いて、PC側でめそ子さんの画像(めそ子のコーナーより透過PNGを)DLし、余白を除去と画像サイズの調整を行ったファイルをPythonistaへダウンロードします。
めそ子さんとツーショット撮影をするためのスクリプトを作成
Pythonista3がもつ優秀なコマンド補完機能のおかげで、iOS上でも比較的容易にコードが書けます。
長いコードの記述はPCで行い、先のDropbox File Picker V2.pyを利用してiOS端末にコピーすると便利です。
コードは以下となります。
# -*- coding: utf-8 -*- from PIL import Image from PIL import ImageDraw import photos #img1 = photos.pick_image() img1 = photos.capture_image() img1.convert('RGBA') drawbuffer = ImageDraw.Draw(img1) img2 = Image.open('mesoko2nd_face_default2.png') img1.paste(img2, (-102, 648), img2.split()[3]) #公開時ここから saveimg = photos.save_image(img1) img1.show() #公開時ここまで #修正後ここから img1.show() saveimg = photos.save_image(img1) #修正後ここまで if saveimg is True: print ("saved")
主要部分の解説
#img1 = photos.pick_image() img1 = photos.capture_image()
ここは新規に撮影したい場合はこのままです。iOS端末のカメラロールにある写真を使う場合は「photos.capture」の行をコメントアウトし「photos.pick」の行をアンコメントします。
img1.paste(img2, (-102, 648), img2.split()[3])
ここでめそ子さんの位置を指定しています。数値を書き換えてお好みの位置に調整してください。
上記のままiPhoneSEで実行すると、冒頭の写真の位置になります。
これでいつでもめそ子さんとのツーショット撮影ができるようになりました。
今回は画像ファイルを重ねる処理で遊んでみましたが、文字や図形を重ねることも可能です。撮影者署名やオリジナルのロゴを重ねて楽しむのも良いと思います。
追記-修正内容に関して-
なぜ、print ("saved") する前に、showしたのか。
save_imageが成功して、showが失敗してエラー終了になるならばsaved というメッセージが出ない、ということになると、それは嘘、になる
という指摘を友人がくださいました。なるほど、確かに本スクリプト作成に際して考慮していませんでした。
コードを修正し、同じ(期待していた)結果が得られることを確認しましたので、本記事内のコードも同じ内容に修正いたしました。
この場をお借りしてお詫びいたしますとともに、コードを記述する上で「文脈を意識する」ことの大切さを教えてくれた友人に感謝申し上げます。